/*******************************************************************************
 * Copyright 2012 Francesco Foresti
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *******************************************************************************/
package it.fflabs.dynscript.client.model;

import com.google.gwt.core.client.JavaScriptObject;
import com.google.gwt.core.client.JsArray;

/**
 * <b>gwt-jsClient : JSONData</b><br>
 * <hr>
 * Comment: <br>
 * <hr>
 * 12/dic/2011<br>
 * 
 * @author frafore
 * 
 */
public class JsData<T extends JavaScriptObject> extends JavaScriptObject {

	protected JsData() {}
	
	
	/**
	 * @param json
	 * @param arrayKey - optional.
	 * @return
	 */
	public static final <T extends JavaScriptObject> JsArray<T> asArrayOf(JavaScriptObject json, String arrayKey) {
		JsArray<T> arrayOfT = getAsArrayOf(json,arrayKey);
		for(int i = 0; i < arrayOfT.length(); i++) {
			T as = as(arrayOfT.get(i));
			arrayOfT.set(i, as);
		}
		return arrayOfT;
	}
	
	/**
	 * @param json
	 * @return
	 */
	public static final <T extends JavaScriptObject> T as(JavaScriptObject jso) {
		return getAs(jso);
	}
	
	private static final native <T extends JavaScriptObject> JsArray<T> getAsArrayOf(JavaScriptObject json, String arrayKey) /*-{
		if(arrayKey != null && !arrayKey == "")
			return json[arrayKey];
		return json;
	}-*/;
	
	private static final native <T extends JavaScriptObject> T getAs(JavaScriptObject json) /*-{
		return json;
	}-*/;


	/**
	 * @return
	 */
	public final String asString() {
		return JsData.toString(this);
	}
	
	/**
	 * @param json
	 * @return
	 */
	private static final native String toString(JavaScriptObject json) /*-{
		var out = '';
  		for (var p in json) {
    		out += p + ': ' + json[p] + '\n';
  		}
  		return out;
	}-*/;

}
